#include "Coches.h"

void Coches :: destruirArbol (Nodo * &a){
    if (a != NULL){
        destruirArbol(a->hizq);
        destruirArbol(a->hder);
        delete (a->info);
        delete (a);
        a = NULL;
    }
}

bool Coches :: perteneceEnArbol (Nodo * a, String mat){
    bool encontre = false;
    while (!encontre && a != NULL)
        if (mat == a->info->getMatricula())
            encontre = true;
        else
            if (mat < a->info->getMatricula())
                a = a->hizq;
            else
                a = a->hder;
    return encontre;
}

void Coches :: insertEnArbol (Nodo * &a, Coche * coche){
    if (a == NULL){
        a = new Nodo;
        a -> info = coche;
        a -> hizq = NULL;
        a -> hder = NULL;
    }
    else
        if (coche->getMatricula() < a->info->getMatricula())
            insertEnArbol(a->hizq,coche);
        else
            insertEnArbol(a->hder,coche);
}

Coche * Coches :: obtenerEnArbol (Nodo * a, String mat){
    while (not ( mat == a->info->getMatricula() ) ){
        if (mat < a->info->getMatricula())
            a = a->hizq;
        else
            a = a->hder;
    }
    return (a->info);
}

void Coches :: cargarIterador (Nodo *a, Iterador * &iter){
    if (a != NULL){
        cargarIterador (a->hizq, iter);
        iter->insertar (a->info);
        cargarIterador (a->hder, iter);
    }
}

Coches :: Coches(){
    ABB = NULL;
}

void Coches :: insert(Coche * coche){
    insertEnArbol (ABB, coche);
}

bool Coches :: member(String mat){
    return perteneceEnArbol (ABB, mat);
}

Coche * Coches :: find(String mat){
    return obtenerEnArbol (ABB, mat);
}

Iterador * Coches :: listadoCoches(){
    Iterador * iter=new Iterador;
    cargarIterador (ABB, iter);
    return iter;
}

Coches :: ~Coches(){
    destruirArbol(ABB);
}
